#ifndef PHOTONS_Main_Define_Dipole_H
#define PHOTONS_Main_Define_Dipole_H

#include "PHOTONS++/Main/Dipole_Type.H"

namespace ATOOLS {
  class Blob;
}

namespace PHOTONS {
  class Define_Dipole {
    private:
      bool                    m_success;
      bool                    m_photonsadded;
      ATOOLS::Blob*           p_blob;
      ATOOLS::Particle_Vector m_chargedinparticles;
      ATOOLS::Particle_Vector m_neutralinparticles;
      ATOOLS::Particle_Vector m_chargedoutparticles;
      ATOOLS::Particle_Vector m_neutraloutparticles;
      ATOOLS::Particle_Vector m_softphotons;
      Particle_Vector_Vector  m_pvv;
      Dipole_Type::code       m_dtype;

    public:
      Define_Dipole(ATOOLS::Blob*);
      ~Define_Dipole();

      void AddRadiation();
      bool CheckMasses();

      inline bool DoneSuccessfully()             { return m_success; }
      inline bool AddedAnything()                { return m_photonsadded; }
  };


  

  /*!
    \file Define_Dipole.H
    \brief contains the class Define_Dipole
  */

  /*!
    \class Define_Dipole
    \brief classifies and coordinates the treatment of the multipoles given by Photons class
  */
  ///////////////////////////////////////////////////////////////////////////////////////
  // Description of member variables for Define_Dipole
  ///////////////////////////////////////////////////////////////////////////////////////
  /*!
    \var bool Define_Dipole::m_success
    \brief value filled by Dipole_FF/Dipole_FI classes, specifies whether treatment was successful
  */

  /*!
    \var bool Define_Dipole::m_photonsadded
    \brief value filled by Dipole_FF/Dipole_FI classes, tells whether treatment added any photons
  */

  /*!
    \var Blob* Define_Dipole::p_blob
    \brief pointer to blob passed from Photons class
  */

  /*!
    \var Particle_Vector Define_Dipole::m_chargedinparticles
    \brief contains all charged initial state particles of p_blob
  */

  /*!
    \var Particle_Vector Define_Dipole::m_neutralinparticles
    \brief contains all neutral initial state particles of p_blob
  */

  /*!
    \var Particle_Vector Define_Dipole::m_chargedoutparticles
    \brief contains all charged final state particles of p_blob
  */

  /*!
    \var Particle_Vector Define_Dipole::m_neutraloutparticles
    \brief contains all neutral final state particles of p_blob
  */

  /*!
    \var Particle_Vector Define_Dipole::m_softphotons
    \brief contains all photons created by Dipole_FF/Dipole_FI classes
  */

  /*!
    \var Particle_Vector_Vector Define_Dipole::m_pvv
    \brief contains ensemble of all particles of p_blob in respective Particle_Vector's
  */

  /*!
    \var Dipole_Type::code Define_Dipole::m_dtype
    \brief contains the dipole type of p_blob
  */
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  // Description of member methods of Define_Dipole
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  /*!
    \fn Define_Dipole::Define_Dipole(Blob*)
    \brief initialises the main parameters for the treatment of the blob

    In particular:
    - classifies all particles of the blob into the respective Particle_Vector
    - determines the Dipole_Type of the blob
    - creates m_pvv to hand over to Dipole_FF/Dipole_FI classes
    .
  */

  /*!
    \fn void Define_Dipole::AddRadiation()
    \brief gives m_pvv to the correct treatment class, reconstructs the blob after treatment

    In more detail:
    - hands m_pvv over to the Dipole_FF/Dipole_FI classes according to the 
      Dipole_Type determined in constructor
    - if treatment was successful, i.e. momentum conservation is fulfilled, 
      the p_blob will be reconstructed with the corrected particle momenta 
      and all photons
    - values of m_success and m_addedphotons are assigned
    .
  */

  /*!
    \fn bool Define_Dipole::DoneSuccessfully()
    \brief returns m_success
  */

  /*!
    \fn bool Define_Dipole::AddedAnything()
    \brief returns m_photonsadded
  */


}
#endif
